package gestion.camping.controleur;

import gestion.camping.connexion.Connexion;
import gestion.camping.dao.impl.SaisonDao;
import gestion.camping.dao.impl.TarifDao;
import gestion.camping.dao.impl.TypeLocationDao;
import gestion.camping.dto.Saison;
import gestion.camping.dto.Tarif;
import gestion.camping.dto.TypeLocation;
import gestion.camping.vue.ViewTarifDetail;
import gestion.camping.vue.ViewTarifListe;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JDialog;

public class TarifController{
	
	private Tarif tarif;
	private Saison saison;
	private TypeLocation typeLocation;
	private double prix;
	private List<Tarif> listTarif;
	private List<Saison> listSaison;
	private List<TypeLocation> listTypeLocation;
	private TarifDao tarifDao = new TarifDao(Connexion.getInstance());
	private SaisonDao saisonDao = new SaisonDao(Connexion.getInstance());
	private TypeLocationDao typeLocationDao = new TypeLocationDao(Connexion.getInstance());
	private ViewTarifDetail frameDetail;
	private ViewTarifListe frameListe;
	private boolean isPossibleEnregistrer;
	
	/**
	 * Constructeur du controlleur tarif
	 */
	public TarifController(){
		this.isPossibleEnregistrer = true;
		
		this.listSaison = saisonDao.findAllSaison();
		this.listTypeLocation = typeLocationDao.findAllTypeLocation();
		
		saison = new Saison();
		typeLocation = new TypeLocation();
		
	}
	
	public TarifController(boolean isPossibleEnregistrer){
		this.isPossibleEnregistrer = isPossibleEnregistrer;
		
		this.listSaison = saisonDao.findAllSaison();
		this.listTypeLocation = typeLocationDao.findAllTypeLocation();
	}


	
	/**
	 * Accesseur aux JPanel contenant la liste des tarifs
	 * @return JPanel viewListe
	 */
	public ViewTarifListe getViewListe(){
		
		if(listTarif == null){
			listTarif = new ArrayList<Tarif>();
		}
		
		//On crée la fenêtre
		frameListe = new ViewTarifListe(this);
	
		rechercher(null, null);
		
		return frameListe;
	}
	
	/**
	 * Accesseur aux JPanel contenant le détail d'une tarif
	 * @return JPanel viewDetail
	 */
	public JDialog getViewDetail(){
		
		// Si tarif est différent de null 
		if(tarif == null){
			//on est en création
			//On crée un objet vide
			tarif = new Tarif();
		}
				
		//On crée la fenêtre
		frameDetail = new ViewTarifDetail(this);
		
		frameDetail.setVisible(true);
		
		return frameDetail;
	}

	/**
	 * Permet la gestion de l'action utilisateur Enregistrer
	 * @param tarif
	 */
	public void enregistrer(Tarif tarif) {
		System.out.println(tarif.toString());
		
		this.tarif = tarif;
		
		if(isPossibleEnregistrer){
			//Si l'ID est zéro
			if(tarifDao.chercher(tarif.getSaison(), tarif.getTypeLocation()) == false){ 
				//On est en création
				this.tarif = tarifDao.create(this.tarif);
			}else{
				//On n'est en modification
				this.tarif = tarifDao.update(this.tarif);
			}
			frameDetail.setTarif(this.tarif);
		}			
				
	}

	/**
	 * Permet la gestion de l'action utilisateur Rechercher
	 */
	public void rechercher(Saison saison, TypeLocation typeLocation) {
		
		//On alimente la liste des emplacements
		if(saison == null && typeLocation == null){
			this.listTarif = tarifDao.findAllTarif();
		}else{
			this.listTarif = tarifDao.findBySaisonTypeLocation(saison , typeLocation);
			
			this.setSaison(saison);
			this.setTypeLocation(typeLocation);
		}
		
		
		
		//On met à jour la fenêtre
		frameListe.setListTarif(listTarif);
	}

	/**
	 * Permet la gestion de l'action utilisateur Modifier
	 * @param personne
	 */
	public void modifier(Tarif tarif) {
		//On affecte la personne que l'on veut modifier	
		this.tarif = tarif;
		
		//On affiche la fenêtre de détail
		this.getViewDetail();
	}

	/**
	 * Permet la gestion de l'action utilisateur Retour à liste 
	 */
	public void retour() {
		if(isPossibleEnregistrer){
			//Si une recherche avait été faite
			if(listTarif != null && listTarif.size() > 0){
				//On effectue la dernière recherche
				rechercher(saison , typeLocation);
			}
		}else{
			if(listTarif != null){
				//On recherche si la personne et déja présente dans la lite
				int i;
				for(i=0; i<listTarif.size() && listTarif.get(i).getSaison()!= tarif.getSaison() && listTarif.get(i).getTypeLocation() != tarif.getTypeLocation(); i++);
				if(i == listTarif.size()){
					listTarif.add(tarif);
				}else{
					listTarif.remove(i); 
					listTarif.add(i, tarif);
				}
				
				//On met à jour la fenêtre
				frameListe.setListTarif(listTarif);
				
			}
		}
	}
	

	/**
	 * Permet la gestion de l'action utilisateur Ajouter 
	 */
	public void ajouter(){
		this.tarif = new Tarif();
		
		
		this.getViewDetail();
	}

	public boolean isPossibleEnregistrer() {
		return isPossibleEnregistrer;
	}

	public void setPossibleEnregistrer(boolean isPossibleEnregistrer) {
		this.isPossibleEnregistrer = isPossibleEnregistrer;
	}

	public TypeLocation getTypeLocation() {
		return typeLocation;
	}

	public void setTypeLocation(TypeLocation typeLocation) {
		this.typeLocation = typeLocation;
	}

	public Saison getSaison() {
		return saison;
	}

	public void setSaison(Saison saison) {
		this.saison = saison;
	}

	public Tarif getTarif() {
		return tarif;
	}

	public void setTarif(Tarif tarif) {
		this.tarif = tarif;
	}

	public List<Tarif> getListTarif() {
		return listTarif;
	}

	public void setListTarif(List<Tarif> listTarif) {
		this.listTarif = listTarif;
	}

	public Double getPrix() {
		return prix;
	}

	public void setPrix(Double prix) {
		this.prix = prix;
	}

	public List<Saison> getListSaison() {
		return listSaison;
	}

	public void setListSaison(List<Saison> listSaison) {
		this.listSaison = listSaison;
	}

	public List<TypeLocation> getListTypeLocation() {
		return listTypeLocation;
	}

	public void setListTypeLocation(List<TypeLocation> listTypeLocation) {
		this.listTypeLocation = listTypeLocation;
	}	
}
